package cm.tl.pms.util;

import cn.hutool.core.util.ObjectUtil;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author: lwp
 * @date: 2024/10/31 16:52
 * @description
 * @version: 1.0
 */
public class DataUtil {

    /**
     * 根据指定字段分组，并保留每组中指定字段最新的记录
     *
     * @param dataList     数据列表
     * @param groupByField 分组字段
     * @param compareField 比较字段
     * @param <T>          数据类型
     * @param <K>          分组字段类型
     * @param <C>          比较字段类型
     * @return 分组后的数据列表
     */
    public static <T, K, C extends Comparable<? super C>> List<T> groupByAndKeepLatest(
            List<T> dataList,
            Function<T, K> groupByField,
            Function<T, C> compareField) {

        Map<K, Optional<T>> groupedMap = dataList.stream()
                .filter(item -> ObjectUtil.isNotEmpty(groupByField.apply(item)))
                .collect(Collectors.groupingBy(
                        groupByField,
                        Collectors.maxBy(Comparator.comparing(compareField))
                ));

        return groupedMap.values().stream()
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toList());
    }
}
